package es.fonso.visual;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.text.BadLocationException;

import es.fonso.codigo.Categoria;
import es.fonso.codigo.Configuracion;
import es.fonso.codigo.Descarga;
import es.fonso.codigo.Pagina;
import es.fonso.codigo.Url;
import es.fonso.codigo.acciones.DescargarListado;
import es.fonso.codigo.acciones.LeerListado;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.ImageIcon;

public class MainWindow extends JFrame {
	
	private static final int TAM_COLUMNA_5 = 175;
	private static final int TAM_COLUMNA_4 = 75;
	private static final int TAM_COLUMNA_3 = 100;
	private static final int TAM_COLUMNA_2 = 75;
	private static final int TAM_COLUMNA_1 = 60;
	private static final int TAM_COLUMNA_0 = 400;
	private static final String MAIN_URL = "http://divxatope.com";
	private static final String URL_BUSQUEDA = "http://divxatope.com/main.php?q=";

	private static final String[] LISTA_SERVIDORES = new String[] {
		"Mega",
		"SockShare",
		"1 Fichier"
		};
	
	private static JPanel contentPane;
	private JTextField formBusqueda;
	private static JTable table;
	private static Modelo modeloLista;
	private static JScrollPane scrollPane;
	private static JTextPane textPane;
	private static JComboBox formListaServidores;
	private static JPanel panelPaginacion;
	private static JComboBox formListaCategorias;
	
	private static JButton btnObtenerListado;
	private static JButton btnDescargar;
	private static JButton btnBuscar;
	private static JButton btnLimpiar;
	private static JButton btnCopiarEnlaces;
	private JMenuItem mntmNewMenuItem;
	private JMenu mnOpciones;
	private JMenu mnAyuda;
	private JMenuItem mntmAcercaDeFontorrent;
	private JMenuItem mntmDirectorioDeTorrents;
	
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow frame = new MainWindow();
					frame.setVisible(true);
					frame.formBusqueda.requestFocusInWindow();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainWindow() {
		setTitle("FonTorrent 1.6");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 1054, 728);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblUrl = new JLabel("Categoria");
		lblUrl.setBounds(40, 61, 69, 14);
		contentPane.add(lblUrl);
		
		//BOTON OBTENER LISTADO---------------------------------------------
		btnObtenerListado = new JButton("Obtener listado");
		btnObtenerListado.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {		
				limpiarListado();
				
				habilitarTodo(false);
				Categoria categoriaElegida = (Categoria )formListaCategorias.getSelectedItem();
				Url urlPrincipal = new Url(categoriaElegida.getUrl());				
				new LeerListado().run(urlPrincipal);				
			}			
		});		
		btnObtenerListado.setBounds(391, 57, 199, 23);
		contentPane.add(btnObtenerListado);
		//---------------------------------------------
		
		
		scrollPane = new JScrollPane();
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setBounds(40, 141, 960, 305);

		contentPane.add(scrollPane);
		
		modeloLista = new Modelo();
		
		table = new JTable(modeloLista);
		scrollPane.add(table);
		scrollPane.setViewportView(table);
		table.setFillsViewportHeight(true);
		table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		table.setModel(modeloLista);
		table.getColumnModel().getColumn(0).setPreferredWidth(TAM_COLUMNA_0);
		table.getColumnModel().getColumn(1).setPreferredWidth(TAM_COLUMNA_1);
		table.getColumnModel().getColumn(2).setPreferredWidth(TAM_COLUMNA_2);
		table.getColumnModel().getColumn(3).setPreferredWidth(TAM_COLUMNA_3);
		table.getColumnModel().getColumn(4).setPreferredWidth(TAM_COLUMNA_4);
		table.getColumnModel().getColumn(5).setPreferredWidth(TAM_COLUMNA_5);
//		table.setModel(new DefaultTableModel(
//			new Object[][] {
//			},
//			new String[] {
//				"New column", "New column", "New column", "Nombre"
//			}
//		));
		
		textPane = new JTextPane();
		textPane.setBounds(40, 553, 960, 103);
		contentPane.add(textPane);
		
		//BOTON DESCARGAR ---------------------------------------------
		btnDescargar = new JButton("Descargar Torrents Seleccionados");
		btnDescargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				habilitarTodo(false);
				int seleccion[] = table.getSelectedRows();				
				ArrayList<Descarga> seleccionArray = modeloLista.getDescargas(seleccion);				
				new DescargarListado().run(seleccionArray);
			}
		});
		btnDescargar.setBounds(40, 519, 315, 23);
		contentPane.add(btnDescargar);
		//---------------------------------------------
		
		
		JLabel lblBuscar = new JLabel("Buscar");
		lblBuscar.setBounds(40, 99, 46, 14);
		contentPane.add(lblBuscar);
		
		formBusqueda = new JTextField();
		formBusqueda.setColumns(10);
		formBusqueda.setBounds(119, 96, 262, 20);
		formBusqueda.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ejecutarBusqueda();
			}
		});
		contentPane.add(formBusqueda);
		
		//BOTON BUSCAR ---------------------------------------------
		btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ejecutarBusqueda();
			}
		});
		btnBuscar.setBounds(391, 91, 199, 23);
		contentPane.add(btnBuscar);
		//------------------------------------------------------------
		
		//BOTON LIMPIAR ---------------------------------------------------
		btnLimpiar = new JButton("Limpiar Listado");
		btnLimpiar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				limpiarListado();
			}
		});
		btnLimpiar.setBounds(880, 519, 120, 23);
		contentPane.add(btnLimpiar);
		//------------------------------------------------------------
		
		
		//BOTON COPIAR ENLACES ---------------------------------------------------
		btnCopiarEnlaces = new JButton("Copiar Enlaces");
		btnCopiarEnlaces.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int seleccion[] = table.getSelectedRows();				
				ArrayList<Descarga> seleccionArray = modeloLista.getDescargas(seleccion);
		
				StringBuffer contenido = new StringBuffer();
				for (Descarga d : seleccionArray){
					contenido.append(d.getUrlServidor(formListaServidores.getSelectedIndex())).append("\n");
				}
				
				Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
				StringSelection ss = new StringSelection(contenido.toString());
			    clipboard.setContents(ss, null);
			}
		});
		btnCopiarEnlaces.setBounds(544, 519, 120, 23);
		contentPane.add(btnCopiarEnlaces);
		
		formListaServidores = new JComboBox();
		formListaServidores.setName("formListaServidores");
		formListaServidores.setModel(new DefaultComboBoxModel(LISTA_SERVIDORES));
		formListaServidores.setBounds(377, 522, 158, 20);
		contentPane.add(formListaServidores);
		
		panelPaginacion = new JPanel();
		panelPaginacion.setBounds(40, 466, 960, 40);
		contentPane.add(panelPaginacion);
		
		//CATEGORIAS
		formListaCategorias = new JComboBox();
		formListaCategorias.setBounds(119, 57, 262, 23);
		formListaServidores.setName("formListaCategorias");
		Url urlPrincipal = new Url(MAIN_URL);
		try{
			urlPrincipal.obtenerCodigo();
			urlPrincipal.cargarCategorias();			
		}		
		catch (Exception e){
			log(e.getLocalizedMessage());
		}
		formListaCategorias.setModel( new DefaultComboBoxModel(urlPrincipal.getCategorias()));		
		contentPane.add(formListaCategorias);
		//FIN CATEGORIAS
		
		JMenuBar menuBar = new JMenuBar();
		menuBar.setBounds(0, 0, 1038, 21);
		contentPane.add(menuBar);
		
		JMenu mnNewMenu = new JMenu("Archivo");
		menuBar.add(mnNewMenu);
		
		mntmNewMenuItem = new JMenuItem("Salir");
		mnNewMenu.add(mntmNewMenuItem);
		
		mnOpciones = new JMenu("Opciones");
		menuBar.add(mnOpciones);
		
		mntmDirectorioDeTorrents = new JMenuItem("Directorio de torrents...");
		mntmDirectorioDeTorrents.setIcon(new ImageIcon(MainWindow.class.getResource("/javax/swing/plaf/metal/icons/ocean/directory.gif")));
		mntmDirectorioDeTorrents.setSelectedIcon(new ImageIcon(MainWindow.class.getResource("/javax/swing/plaf/metal/icons/ocean/newFolder.gif")));
		mntmDirectorioDeTorrents.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				JFileChooser j = new JFileChooser(Configuracion.get("torrentDir"));
				j.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
				j.showSaveDialog(MainWindow.contentPane);
				if (j.getSelectedFile()!=null) Configuracion.set("torrentDir", j.getSelectedFile().getPath());
			}
		});
		mnOpciones.add(mntmDirectorioDeTorrents);
		
		mnAyuda = new JMenu("Ayuda");
		menuBar.add(mnAyuda);
		
		mntmAcercaDeFontorrent = new JMenuItem("Acerca de FonTorrent");
		mnAyuda.add(mntmAcercaDeFontorrent);
		
		//Cargar categorias:
		
		
		Configuracion.cargarConfiguracion();
//		JButton btnNewButton = new JButton("New button");
//		btnNewButton.setFont(new Font("Tahoma", Font.BOLD, 12));
//		panelPaginacion.add(btnNewButton);
		// ---------------------------------------------------
	}
	
	
	public static void actualizarListado(ArrayList<Descarga> listaDescargas){		
		modeloLista.addDescargas(listaDescargas);
		table.repaint();
		MainWindow.log("Listado actualizado");
	}
	
	public static void log(String texto){
		try {
			textPane.getDocument().insertString(0,GregorianCalendar.getInstance().getTime().toLocaleString() + " - " + texto+"\n",null);
		} catch (BadLocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		textPane.repaint();
	}
	
	public static void habilitarTodo(boolean habilitar){
		btnObtenerListado.setEnabled(habilitar);
		btnDescargar.setEnabled(habilitar);
		btnBuscar.setEnabled(habilitar);
		btnLimpiar.setEnabled(habilitar);
		btnCopiarEnlaces.setEnabled(habilitar);
		formListaServidores.setEnabled(habilitar);
		for (Component boton : panelPaginacion.getComponents()){
			boton.setEnabled(habilitar);
		}
		formListaCategorias.setEnabled(habilitar);
		
	}

	public static void actualizarPaginacion(ArrayList<Pagina> paginacion) {
		panelPaginacion.removeAll();
		panelPaginacion.repaint();
		for (final Pagina p : paginacion) {
			JButton btnNewButton = new JButton(String.valueOf(p.getNumero()));
			if (p.isActual()){
				btnNewButton.setFont(new Font("Tahoma", Font.BOLD, 12));
			}
			else{
				btnNewButton.setFont(new Font("Tahoma", Font.PLAIN, 10));
				btnNewButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {		
						habilitarTodo(false);
						limpiarListado();
						Url urlPrincipal = new Url(p.getUrl());				
						new LeerListado().run(urlPrincipal);
					}			
				});
			}	
			
			panelPaginacion.add(btnNewButton);
		}
		
	}

	private static void limpiarListado() {
		modeloLista=new Modelo();
		table.setModel(modeloLista);
		table.repaint();
		table.getColumnModel().getColumn(0).setPreferredWidth(TAM_COLUMNA_0);
		table.getColumnModel().getColumn(1).setPreferredWidth(TAM_COLUMNA_1);
		table.getColumnModel().getColumn(2).setPreferredWidth(TAM_COLUMNA_2);
		table.getColumnModel().getColumn(3).setPreferredWidth(TAM_COLUMNA_3);
		table.getColumnModel().getColumn(4).setPreferredWidth(TAM_COLUMNA_4);
		table.getColumnModel().getColumn(5).setPreferredWidth(TAM_COLUMNA_5);
		panelPaginacion.removeAll();
		panelPaginacion.repaint();
	}

	private void ejecutarBusqueda() {
		limpiarListado();
		
		habilitarTodo(false);
		Url urlPrincipal = new Url(URL_BUSQUEDA+formBusqueda.getText().replaceAll(" ", "+"));				
		new LeerListado().run(urlPrincipal);
	}
}
